package com.bjpowernode.custom_annotation;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 *使用注解方式实现aop
 *
 */
@Component
@Aspect
public class MyAspect {
	//自定义方法，增加功能
	
	/**
	 * @Before:前置通知
	 *   
	 * 特点：
	 *  1.在目标方法之前执行的。
	 *  2.不会影响目标方法的执行，也不能改变目标方法的执行结果。
	 */

	
	/**
	 * 使用方法名通配符
	 */
	@Before(value="execution(* com.bjpowernode..create*())")
	public void createBefore(JoinPoint jp){
		Object[] args = jp.getArgs();
		  for (Object object : args) {
				System.out.println(object.getClass());
				System.out.println(object.getClass().getName());
			}
		
		
		
		//功能增强的代码
		System.out.println("前置通知：create过程马上开始");
	}
	
	
	
	/**
	 * 后置通知，使用自定义注解方式
	 * 参考	@After("within(com.bjpowernode.cms.cms.*.service.impl..*) && @annotation(as)")
	 * 由于通知是直接以标签的形式放到方法上的，所以切点表达式不需要明确方法
	 * 
	 */
//	@Before("within(com.bjpowernode.custom_annotation..*) && @annotation(as)")
//    public void useArgs(CustomAnnotation as) {
////        for (Object object : args) {
////        	System.out.println(args.length);
////			System.out.println(object.getClass());
////			System.out.println(object.getClass().getName());
//		System.out.println("使用自定义注解的前置通知：create结束,自定义字符串为：");
//		}
//    }

	@Around("within(com.bjpowernode.custom_annotation..*) && @annotation(as)")
	public void useArgs(ProceedingJoinPoint pj, CustomAnnotation as) {
	    
		System.out.println("使用自定义注解的前置通知：create结束,自定义字符串为：");
		
		//获取方法名称
		System.out.println(pj.getSignature());
		
	}
	}

	

	
